﻿using NetDh.Lib;
using NetDh.Presentation.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace NetDh.WebApiAndMvc.Sample.Controllers
{
    [MvcActionFilter(AllowAnonymous = true)]//登录Controller默认不需要身份验证
    public class LoginController : BaseMvcController
    {
        public ActionResult Index()
        {
            if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated && this.CurrentUser != null)
            {
                //用户已经登录过，则直接从登录页跳到首页
                return new RedirectResult("/");
            }
            return View();
        }
        [HttpPost]
        [ActionName("submit")]
        public ActionResult SubmitLogin()
        {
            //test  模拟普通用户登录
            //var user = new UserToken()
            //{
            //    UserId = "u01",
            //    UserName = "uname01",
            //    UserType = "user",
            //    Platform = Request.Browser.Platform,
            //};
            // 模拟管理员登录
            var user = new UserToken()
            {
                UserId = "u02",
                UserName = "admin01",
                UserType = "admin",
                Platform = Request.Browser.Platform,
            };
            var ticket = TokenHelper.GetUserTicket(user);
            //FormsAuthentication.LoginUrl:StatusCode遇到401时自动跳转到的url。值为config设置的loginUrl，默认是login.aspx，现改为/login
            //FormsAuthentication.Timeout:票证的过期时间。值为config设置的timeout(分钟),默认是30分钟，需要如下代码使用。
            //FormsAuthentication.SlidingExpiration:是否启用弹性过期时间，如果有访问服务器，则重新更新票据的过期时间，一直续命。值为slidingExpiration设置的值，默认是true。
            //FormsAuthentication.FormsCookieName:票证的Cookie名称。值为config的name。默认是.ASPXAUTH
            //"tmpUserName"也可以改成user.UserName，再配合config的 <deny users="tmpUserName"/>设置，就可以明确禁哪些用户访问，会自动跳到loginUrl(/login.aspx?ReturnUrl=%2f)  
            //而且可以用((FormsIdentity)HttpContext.Current.User.Identity).Ticket.Name获取到和票据关联的用户名，
            //而这边是用自加密的UserToken，因此随便起个名"tmpUserName"。
            var formTicket = new FormsAuthenticationTicket(1, "tmpUserName", DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), false, ticket);
            //加密身份信息，保存至Cookie
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(formTicket));
            //cookie过期时是浏览器会把cookie删除，那么票据也一定被删除了。
            //这边是cookie不设置过期时间，而票据设置过期时间，并且把SlidingExpiration设置为true。
            //cookie.Expires = DateTime.Now.AddSeconds(30);
            //cookie.HttpOnly = true;//对应config的<httpCookies httpOnlyCookies="true" />。
            cookie.Secure = Request.Url.ToString().ToLower().StartsWith("https");//Secure默认是false，如果web部署时使用了https，则为true。如果cookie.Secure设置为true，那么在http中是不可使用。
            //Response.Cookies.Remove(cookie.Name);//如果cookie策略更改时，才可能用到下。 
            Response.Cookies.Add(cookie);
            return Json("login ok");
        }

        public ActionResult SignOut()
        {
            FormsAuthentication.SignOut();
            return new RedirectResult("/login");
        }

    }
}